﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistencia;
using GestorDeFlotasModelo.Entities;
using System.Data.SqlClient;
using Persistencia.Interfaces;

namespace GestorDeFlotasModelo.Factorias
{
    public partial class FactoriaChofer : Factoria, IIdentityFactory
    {
          private FactoriaChofer(TransaccionBase tran)
            : base(tran)
        {
        }
       

        public override string NombreTabla
        {
            get { return " NUESTRA_RUBIA_ES_MEJOR.Chofer "; }
        }

        protected override IPersistibleModelo NuevoPersistible(HashTableNCSensitive htsNc)
        {
            return new Chofer();
        }

        protected override string Id(HashTableNCSensitive hts)
        {
            return hts["Chofer_Id"].ToString();
        }

        protected override HashTableNCSensitive ParametrosClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Chofer_Id", null);
            return parameters;
        }

        protected override HashTableNCSensitive ParametrosNoClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Chofer_Apellido", null);
            parameters.Add("Chofer_Direccion", null);
            parameters.Add("Chofer_Dni", null);
            parameters.Add("Chofer_Fecha_Nac", null);
            parameters.Add("Chofer_Habilitado", null);
            parameters.Add("Chofer_Mail", null);
            parameters.Add("Chofer_Nombre", null);
            parameters.Add("Chofer_Telefono", null);
            return parameters;
        }


        protected override Predicate<IPersistibleModelo> FiltroXId(string id)
        {
            return delegate(IPersistibleModelo iPer)
            {
                return ((Chofer)iPer).Id == long.Parse(id);
            };
        }

        public List<Chofer> SelectTodosHabilitados()
        {
            SqlCommand comm = new SqlCommand();
            string consulta = "SELECT * FROM " + this.NombreTabla + " WHERE Chofer_Habilitado=1";
            comm.CommandText = consulta;
            return base.Select<Chofer>(comm, delegate(IPersistibleModelo iPer) { return ((Chofer)iPer).Habilitado; });
        }

        public List<Chofer> SelectChoferesConFiltro(string nombre, string apellido, long dni)
        {
            string where = " WHERE ((@Nombre IS NULL OR  LOWER(Chofer_Nombre) LIKE '%' + @Nombre + '%') AND "
                                 + "(@Apellido IS NULL OR LOWER(Chofer_Apellido) LIKE '%' + @Apellido + '%') AND "
                                 + "(@Dni IS NULL OR Chofer_Dni = @Dni)) ";
            List<SqlParameter> parametros = new List<SqlParameter>();

            if (nombre == null)
                parametros.Add(new SqlParameter("@Nombre", DBNull.Value));
            else
                parametros.Add(new SqlParameter("@Nombre", nombre.ToLower()));

            if (apellido == null)
                parametros.Add(new SqlParameter("@Apellido", DBNull.Value));
            else
                parametros.Add(new SqlParameter("@Apellido", apellido.ToLower()));

            if (dni < 0)
                parametros.Add(new SqlParameter("@Dni", DBNull.Value));
            else
                parametros.Add(new SqlParameter("@Dni", dni));

            List<Chofer> choferes = base.Select<Chofer>(where,
                delegate(IPersistibleModelo iPer)
                {
                    return (string.IsNullOrEmpty(nombre) || ((Chofer)iPer).Nombre.ToLower().Contains(nombre.ToLower())) &&
                          (string.IsNullOrEmpty(apellido) || ((Chofer)iPer).Apellido.ToLower().Contains(apellido.ToLower())) &&
                          (dni < 0 || ((Chofer)iPer).Dni == dni);
                }
                , parametros);

            choferes.Sort(delegate(Chofer c1, Chofer c2)
            {
                return c1.Id.CompareTo(c2.Id);
            });

            return choferes;
        }

        public List<Chofer> MejorChofer(string desde, string hasta)
        {
            SqlCommand comm = new SqlCommand();
            string consulta = "SELECT TOP 5 C.Chofer_Dni ,C.Chofer_Apellido,C.Chofer_Nombre,C.Chofer_Telefono,C.Chofer_Fecha_Nac, SUM(R.RendicionPorChofer_Importe) Recaudacion FROM NUESTRA_RUBIA_ES_MEJOR.CHOFER C ";
            consulta += " JOIN NUESTRA_RUBIA_ES_MEJOR.RendicionPorChofer R ON R.RendicionPorChofer_Chofer=C.Chofer_Id WHERE R.RendicionPorChofer_Fecha>=@Desde AND R.RendicionPorChofer_Fecha<=@Hasta ";
            consulta += " Group BY Chofer_Dni,C.Chofer_Apellido,C.Chofer_Nombre,C.Chofer_Telefono,C.Chofer_Fecha_Nac ORDER BY Recaudacion DESC";
            comm.CommandText = consulta;
            comm.Parameters.AddWithValue("@Desde", DateTime.Parse(desde));
            comm.Parameters.AddWithValue("@Hasta", DateTime.Parse(hasta));
            List<HashTableNCSensitive> resultado = this.Transaccion.EjecutarComando(comm, 5);
            List<Chofer> choferes = new List<Chofer>();
            foreach (HashTableNCSensitive row in resultado)
            {
                Chofer c = new Chofer();
                ((IPersistibleModelo)c).Cargar(row);
                choferes.Add(c);
            }
            return choferes;
        }

        public Chofer Nuevo(string apellido, string nombre, int dni, string domicilio, string email, int telefono, DateTime fechaNac, bool habilitado)
        {
            Chofer c = new Chofer();
            c.Apellido = apellido;
            c.Nombre = nombre;
            c.Dni = dni;
            c.Direccion = domicilio;
            c.Mail = email;
            c.Telefono = telefono;
            c.FechaNacimiento = fechaNac;
            c.Habilitado = habilitado;
            base.Agregar(c);
            return c;
        }
    }
}
